OnWeight · Component Specs

The shared kit

Every OnWeight screen is assembled from one kit (fc-shared.jsx), so screens stay identical. This documents each component — its variants, states, sizing and usage rules — sitting one layer up from Foundations (the tokens) and one below the screens. Specimens render in the Balanced theme.

01 Actions

HeroButton the daily weigh-in CTA
THE one red action the whole app is built around — logging today's weight. Distinct from PrimaryButton; red, never ink.
Hero · red accent fill, white plus-disc
Use
Only for “log today's weight” — Today/Dashboard, empty states, trend. One per screen.
Sizing
min-height 58, full-width, radius 16. White (22%) plus-disc; Oswald label 15/0.13em uppercase.
vs Primary
Hero = red (the daily habit). PrimaryButton = ink (every other primary action). Never two reds competing.
Component
HeroButton in fc-shared.jsx.
PrimaryButton label · plus · big · disabled
The one filled action per screen. Ink fill, paper text, accent “plus” disc for log/add actions.
Default · with plus · big Outline (secondary) · Disabled
Sizing
min-height 52px, big 58px. Full-width. Radius 14 (--radius-ctl).
States
Default (ink) · pressed (dim 92%) · disabled (rule fill, ink-3 text) · loading (spinner, label hidden).
Variants
Solid ink (primary) · outline (secondary) · accent plus-disc for log/add.
Rule
One primary per screen. Label is the outcome (“Unlock my plan”), never “Submit”.
TextButton / NavAction accent link
Low-emphasis inline action — “Details”, “Restore”, nav-bar Done/Cancel.
Details Restore purchases Cancel
Sizing
min 44pt tap target even though text is small.
States
Default accent · neutral (ink-3) for Cancel/dismiss · pressed dim.
Rule
Accent = forward/affirmative; ink-3 = dismiss. Never two accent text-buttons competing.

02 Surfaces

Card pad · inverted · tint
The base surface. White by default; inverted ink for a hero; tint for a quiet secondary block.
Default card
White surface, soft shadow, radius 20.
Inverted
Ink fill for the hero weight only.
Tint
Paper-2, hairline, no shadow — secondary.
Sizing
Radius 20 (--radius), pad 18–22, --card-shadow. Balanced uses shadow, not border.
Variants
default white · inverted (ink, hero only) · tint (paper-2 + hairline, no shadow).
Rule
Cards pairing copy + numbers use a 1px --rule divider between the two halves.
GroupedList + Row value · chevron · control · note
iOS-style grouped rows for settings, details and selects.
WeightKilograms
Morning reminder
Sign out
Sizing
Row min-height 50px; 16px side padding; hairline between rows, none on last.
Row slots
label · value (ink-3) · chevron · control (Toggle) · note (caption below) · destructive (accent label).
States
Default · pressed (paper-2 fill) · with-control · last (no divider).

03 Data & feedback

ToneBadge green · amber · red · dark
The pace verdict pill. Tone + word, never tone alone.
On track Behind Off pace Dark
Variants
green / amber / red tone; dark for inverted cards.
Rule
Always pairs a dot + a word. Red reserved for genuine risk. Never colour-only.
Stat label · value · unit · sub
Canonical stat column; left divider when grouped.
Projected
74.2
On track
Limit
74.4
41 days
3.6
Anatomy
mono label · Num value (tnum) · optional unit · optional sub (tone-coloured).
Grouping
2–3 across; left 1px divider on every column after the first.
Units
Every weight value formats through OWUnits (kg / lb, one setting) — never hardcode a unit string.
ProgressBar · Toggle
Weekly-loss track and the boolean control.
ProgressBar · tone fill
Toggle · on (green) / off (rule-2)
ProgressBar
6px track (--rule), tone fill, min 3% visible.
Toggle
50×30; on = t-green, off = rule-2; 26px white knob.
CoachTip
The corner-coach aside — soft-tinted, chip + headline + body.
Day 3
Three down. Don't chase the daily number.

A morning can swing half a kilo on water alone. The weekly view smooths that out.

Variants
tone accent (default) / green / amber; bullets instead of body; note for disclaimers.
Voice
Always the coach. See Copy Rules.
Trend chart FCChart · weight trajectory
The signature data view — the decided chart, consolidated here from Chart Explorer. Daily weigh-ins as a soft band around the smooth EWMA trend, the cycle-adjusted plan line, and the limit marker.
LIMIT
Anatomy
EWMA trend (ink) · raw dots in a soft band · dashed cycle-adjusted plan · accent limit marker. Tap a point → dark readout pill.
Variants
Trend · week-compare · fight-week water-cut · noise band — the interactive set lives in Chart Explorer.
Rule
Read the line, not the dots. Tabular figures; red reserved for the limit.

04 Conversion & onboarding

Introduced by the BFM design audit (Jun 2026) and shared across the funnel. See Logic & Flows §18.8 and OnWeight - Social Proof Research.md.

ProofBand sport · quote · compact
The social-proof band — a distinct full-bleed editorial block (not a Card), so proof never reads as card-on-card. Reused on the paywall (full, with quote) and the Coach's Read (compact, no quote).
The standard you're held to
88–95% of MMA fighters cut to make weight
"The weight cut is the hardest part of the fight."Robert Whittaker · ex-UFC champion
Keep a fight-week cut under ~5% of body weight to protect power and recovery.
Anatomy
mono eyebrow → sport stat (hero) → supporting line → optional real fighter quote (serif italic, tap to cycle) → safety footnote.
Variants
full (paywall, quote on) · compact (Coach's Read — stat + line + footnote, no quote).
Content
Sport stat from FC_SOCIAL_PROOF (falls back to combat-wide 60–80%); quotes from FC_FIGHTER_QUOTES (real, verbatim, attributed). No fabricated user counts — OnWeight is pre-launch.
Rule
Full-bleed, never wrapped in a Card. Assumes a 20px-padded parent. One per screen.
Component
ProofBand in fc-screens-b.jsx.
Division picker limit screen · OnbGoalWeight
"Your limit" leads with a one-tap class list — the natural class starred, the scale target autofilled (gear allowance applied) — with the keypad kept below as the custom fallback. Lowers load and proves the bespoke per-sport logic.
Tap your class or type a custom limit
Lightweight Natural70.3 kg
Featherweight65.3 kg
Row
class name · Natural tag on the recommended class · autofilled scale target (division limit − equipment) · radio check.
Selection
Tap fills the keypad value; selected row = accent-soft fill + filled accent radio. Manual entry stays the escape hatch (gates GoalOutOfRange beyond ±20 kg).
Source
Ladder + gear allowance from FC_SPORTS[sport].divisions[sex] / recommendDivision() (fc-engine.jsx); see Logic & Flows §14.4.
Component
OnbGoalWeight in fc-onboarding.jsx.

05 Chrome

LargeTitle · DashBanner
The top of a screen — eyebrow + title + trailing gear, and the state strip above it.
In camp · Day 150 days out
OnWeight · Round 9/50
Hi, Alex
LargeTitle
accent eyebrow + 28px/700 title + trailing slot (GearButton, aria-label “Settings”).
DashBanner
full-width state strip; tone ink (neutral) / amber (offline, fight week); label + meta.
TabBar active: home·plan·add·progress·more
The five-tab root. Log is the centre primary action, not a destination.
Today
Plan
Log
Trend
More
States
active = ink + 1.7 stroke; inactive = ink-3 + 1.4. aria-current on active.
Rule
Log (centre) opens entry from anywhere; it deep-links to the result, not a tab view.
A11y
Each tab needs a label; icons are decorative (aria-hidden).
OnWeight · Component Specs Foundations → Components → Screens
OnWeight HQ